/*************************************************
func: 封装socket客户端接口，实现tcp或udp通信
author: zyh
date: 2024.4.16
**************************************************/
#ifndef _SOCKET_CLIENT_API_H_
#define _SOCKET_CLIENT_API_H_
 
#ifdef __cplusplus
extern "C" {
#endif
 
#include <pthread.h>
#include <sys/types.h>//数据类型定义文件
#include <sys/socket.h>//提供socket函数及数结构
 
// 定义socket客户端服务信息结构体
typedef struct {
    /*/要连接的远程服务器信息*/
	char *remote_ip;//要连接的远程服务器地址
	int remote_port;//端口
    
    /*本客户端配置*/
/*
    通信字节流类型，其取值如：
    SOCK_STREAM：流式套接字（TCP方式）
    SOCK_DGRAM：数据包套接字（UDP方式）
    SOCK_RAM：原始套接字
*/
	int socket_type;//指明通信字节流类型，默认SOCK_STREAM
	int socket_protocol;//表示传输协议，常用的有 IPPROTO_TCP 和IPPTOTO_UDP，分别表示 TCP 传输协议和 UDP 传输协议。如果为0，协议将自动选择。
	int broadcast_flag;//发送UDP数据通信时是否广播，一般是tcp通信，所以一般设置为0
	int bind_port;//绑定的本地端口，如果为0则不绑定
    int reconnect_time_s;//中断重连时间(秒),如果为0则内部默认1秒
    int socket_fd;//客户端句柄
    
    int rcv_buf_size;//设置接收数据缓冲区大小，如果为0，内部默认1024
    /*状态变量*/
    //int rcv_flag;//1接收到数据，0未接收到
    //int rcv_len;// 大于0为接收到的数据
    //unsigned char *rcv_buf;//rcv_buf[rcv_buf_size]
 
	void *arg;//留给外部的自定义传参
	void (*on_connect)(int socket_fd, void *arg);//当客户端连接上服务器时的回调函数
	void (*on_disconnect)(int socket_fd, void *arg);//当客户端与服务器断开连接时的回调函数
	void (*on_message)(int socket_fd, void *buf, int len, void *arg);//当收到消息时的回调函数
	
	//内部运行状态变量---------	
	int connect_flag;//通信连接的状态，0未连接，1连接正常
	pthread_t thread_id;
	int run_flag;//本服务启动标志：1启动，0未启动或已退出
} socket_client_t;
 
//启动一个socket客户端（这是一个线程服务）
int start_socket_client(socket_client_t *client);
int close_socket_client(socket_client_t *client);
int restart_socket_client(socket_client_t *client);
 
#if 0 //test
socket_client_t client1 = {
	.remote_ip = (char *)"10.10.48.11",
	.remote_port = 6666,
    .socket_type = SOCK_STREAM,
    .socket_protocol = 0,
    .broadcast_flag = 0,
    .bind_port = 0,
    .rcv_buf_size = 0,
    
    .on_connect = NULL,
    .on_disconnect = NULL,
    .on_message = NULL
};
#endif 
 
#ifdef __cplusplus
}
#endif
 
#endif